_init: function(name, size) {
this.actor = new St.Bin({ visible: false });
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
- this.actor.connect('notify::visible', Lang.bind(this, function() {
- if (this.actor.visible) {
- this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
- } else {
- if (this._timeoutId)
- Mainloop.source_remove(this._timeoutId);
- this._timeoutId = 0;
- }
- }));
+ this.actor.connect('notify::visible', Lang.bind(this, this._onVisibleNotify));
this._timeoutId = 0;
- this._i = 0;
+ this._frame = 0;
this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size);
this.actor.set_child(this._animations);
},
- _update: function() {
- this._animations.hide_all();
- this._animations.show();
- if (this._i && this._i < this._animations.get_n_children())
- this._animations.get_nth_child(this._i++).show();
- else {
- this._i = 1;
- if (this._animations.get_n_children())
- this._animations.get_nth_child(0).show();
+ _disconnectTimeout: function() {
+ if (this._timeoutId > 0) {
+ Mainloop.source_remove(this._timeoutId);
+ this._timeoutId = 0;
}
+ },
+
+ _onVisibleNotify: function() {
+ if (this.actor.visible)
+ this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
+ else
+ this._disconnectTimeout();
+ },
+
+ _showFrame: function(frame) {
+ let oldFrameActor = this._animations.get_child_at_index(this._frame);
+ if (oldFrameActor)
+ oldFrameActor.hide();
+
+ this._frame = (frame % this._animations.get_n_children());
+
+ let newFrameActor = this._animations.get_child_at_index(this._frame);
+ if (newFrameActor)
+ newFrameActor.show();
+ },
+
+ _update: function() {
+ this._showFrame(this._frame + 1);
return true;
},
_onDestroy: function() {
- if (this._timeoutId)
- Mainloop.source_remove(this._timeoutId);
+ this._disconnectTimeout();
}
});
typedef struct {
gchar *path;
gint grid_width, grid_height;
- ClutterGroup *group;
+ ClutterActor *actor;
} AsyncImageData;
static void
{
AsyncImageData *d = (AsyncImageData *)data;
g_free (d->path);
- g_object_unref (d->group);
+ g_object_unref (d->actor);
g_free (d);
}
{
ClutterActor *actor = load_from_pixbuf (GDK_PIXBUF (list->data));
clutter_actor_hide (actor);
- clutter_container_add_actor (CLUTTER_CONTAINER (data->group), actor);
+ clutter_actor_add_child (data->actor, actor);
}
}
* note that the dimensions of the image loaded from @path
* should be a multiple of the specified grid dimensions.
*
- * Returns: (transfer none): A new #ClutterGroup
+ * Returns: (transfer none): A new #ClutterActor
*/
-ClutterGroup *
+ClutterActor *
st_texture_cache_load_sliced_image (StTextureCache *cache,
const gchar *path,
gint grid_width,
{
AsyncImageData *data;
GSimpleAsyncResult *result;
- ClutterGroup *group = CLUTTER_GROUP (clutter_group_new ());
+ ClutterActor *actor = clutter_actor_new ();
data = g_new0 (AsyncImageData, 1);
data->grid_width = grid_width;
data->grid_height = grid_height;
data->path = g_strdup (path);
- data->group = group;
- g_object_ref (G_OBJECT (group));
+ data->actor = actor;
+ g_object_ref (G_OBJECT (actor));
result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image);
g_object_unref (result);
- return group;
+ return actor;
}
/**